home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / ileave.arc / RFW.C < prev    next >
Encoding:
C/C++ Source or Header  |  1987-10-07  |  2.7 KB  |  140 lines

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <hamdefs.h>
  4. extern int    have_selected, drive_to_use, factor;
  5.  
  6. static char    intlv_table[512];
  7. static char    disk_buffer[17*512];
  8.  
  9. #define SECTORS 17
  10.  
  11. extern void interrupt (*oldvect)(void);
  12. void interrupt terminate(void)
  13. {
  14.     setvect(0x23, oldvect);
  15.     locate(22, 2);
  16.     vputs("CTRL-C aborts the program at any time");
  17.     locate(23, 0);
  18.     cursor(TRUE);
  19.     exit(0);
  20. }
  21.  
  22.  
  23. rfw()
  24. /* read, format, write */
  25. {
  26.     struct REGPACK send, rec;
  27.     struct SREGS sregs;
  28.     unsigned int    cylinder, head,
  29.     cyl_max, head_max;
  30.     char    temp[80];
  31.     unsigned    percent;
  32.  
  33.     int    pr, pc;
  34.  
  35.     percent = 0;
  36.  
  37.     if (!have_selected) {
  38.         errmsg("You must select which drive to use.....");
  39.         return 0;
  40.     }
  41.  
  42.     build(factor);
  43.     segread(&sregs);
  44.     send.r_es = send.r_ds = sregs.ds;
  45.     send.r_ax = 0x0800;
  46.     send.r_bx = send.r_cx = 0;
  47.     send.r_dx = drive_to_use;
  48.     if (1 & sysint13(&send, &rec)) {
  49.         atputsa(2, 25, "Unable to address hard disk(s)", NORMAL | HILITE);
  50.         beep();
  51.         return 1;
  52.     }
  53.     head_max = rec.r_dx >> 8;
  54.     cyl_max = ((rec.r_cx & 0xc0) << 2) + (rec.r_cx >> 8);
  55.  
  56.     cursor(FALSE);
  57.     atputsa(3, 10, "READ  FORMAT  WRITE   HEAD  CYLINDER", NORMAL | HILITE);
  58.     atputsha(-1, -1, "      Percent complete: ");
  59.     findcsr(&pr, &pc);
  60.     for (cylinder = 0; cylinder <= cyl_max; cylinder++) {
  61.         locate(4, 41);
  62.         sprintf(temp, "%d", cylinder);
  63.         vputs(temp);
  64.         percent = (((unsigned)100 * cylinder) / cyl_max);
  65.         sprintf(temp, "%d", percent);
  66.         atputsha(pr, pc, temp);
  67.         for (head = 0; head <= head_max; head++) {
  68.             locate(4, 33);
  69.             vputc(head + '0');
  70.  
  71.             /* read cylinder */
  72.             clrblk(4, 10, 4, 30);
  73.             atputsha(4, 11, "\315\315");
  74.             send.r_ax = 0x0200 + SECTORS;
  75.             send.r_bx = (unsigned)disk_buffer;
  76.             send.r_cx = (cylinder << 8) + ((cylinder & 0x300) >> 2) + 1;
  77.             send.r_dx = (head << 8) + drive_to_use;
  78.  
  79.             if (1 & sysint13(&send, &rec)) {
  80.                 reset_disk();
  81.                 continue;
  82.             }
  83.  
  84.             if (kbhit()) {
  85.                 if (inkeyi() == 3)
  86.                     terminate();
  87.                 clrkey();
  88.             }
  89.  
  90.             /* format cylinder: */
  91.  
  92.             clrblk(4, 10, 4, 30);
  93.             atputsha(4, 18, "\315\315");
  94.             send.r_ax = 0x0500 + factor;
  95.             send.r_bx = (unsigned)intlv_table;
  96.  
  97.             if (1 & sysint13(&send, &rec)) {
  98.                 reset_disk();
  99.                 continue;
  100.             }
  101.  
  102.             /* write cylinder: */
  103.  
  104.             clrblk(4, 10, 4, 30);
  105.             atputsha(4, 25, "\315\315");
  106.             send.r_ax = 0x0300 + SECTORS;
  107.             send.r_bx = (unsigned)disk_buffer;
  108.  
  109.             if (1 & sysint13(&send, &rec)) {
  110.                 reset_disk();
  111.             }
  112.         }
  113.     }
  114.     return 0;
  115. }
  116.  
  117.  
  118. reset_disk()
  119. {
  120.  
  121.     _AX = 0;
  122.     _DX = drive_to_use;
  123.     geninterrupt(0x13);
  124. }
  125.  
  126.  
  127. build(factor)
  128. int    factor;
  129. {
  130.     int    i, cur;
  131.  
  132.     for (i = cur = 0; i < 17; i++, cur += factor) {
  133.         if (cur > 17)
  134.             cur -= 17;
  135.         intlv_table[(2*cur)+1] = i + 1;
  136.     }
  137. }
  138.  
  139.  
  140.